package com.imooc.pay.controller;

import com.imooc.pay.entity.PayInfo;
import com.imooc.pay.enums.OrderStatusEnums;
import com.imooc.pay.service.PayService;
import com.lly835.bestpay.model.PayResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

@Controller("payController")
@RequestMapping("/paying")
public class PayController {

    Logger logger = LoggerFactory.getLogger(PayController.class);

    @Resource(name = "payService")
    private PayService payService;

    //发起支付
    @GetMapping("/create")
    public ModelAndView create(@RequestParam("orderId") String orderId,
                               @RequestParam("payPlatform") String payPlatform,
                               @RequestParam("amount") String amount) throws Exception {
        PayResponse response = null;
        try {
            response = payService.create(orderId, payPlatform, BigDecimal.valueOf(Double.valueOf(amount)));
        } catch (RuntimeException e) {
            throw new RuntimeException(e.getCause());
        }
        Map<String, String> map = new HashMap<>();
        if (payPlatform.equals("1")) {
            map.put("qrcode", response.getCodeUrl());
            map.put("orderId", orderId);
            return new ModelAndView("native", map);
        } else if (payPlatform.equals("2")) {
            map.put("body", response.getBody());
            map.put("orderId", orderId);
            return new ModelAndView("alipayPC", map);
        } else {
            throw new Exception("目前还不支持的支付类型");
        }
    }

    //接收异步通知，并告诉微信支付系统，不要再给我(商户的支付系统)发送异步通知了。
    @PostMapping("/notify")
    @ResponseBody
    public String asyncNotify(@RequestBody String notifyData) {

        //这部分内部是返回给微信支付系统的，在controller中应该使用@ResponseBody，
        //哪里访问了这个控制器，这个控制器就把数据返回到哪里，
        //如果是浏览器访问了这个控制器就把数据返回给浏览器，
        //如果是某服务器访问了这个控制器，就把数据返回给某服务器。
        //所以不能在controller中使用ModelAndView，因为它会直接跳转至浏览器，并渲染页面。
        //而是使用@ResponseBody。
        logger.info("LiuCaiMo-notifyData={}", notifyData);
        return payService.asyncNotify(notifyData);
    }

    //查询后台是否支付成功
    @PostMapping("/queryPayStatus")
    @ResponseBody
    public Map<String,Object> getPayStatus(@RequestParam("orderId") String orderId) {
        logger.info("LiuCaiMo-orderId={}", orderId);
        HashMap<String, Object> MODEL_MAP = new HashMap<>();
        PayInfo payInfo = payService.selectByOrderId(Long.valueOf(orderId));
        logger.info("LiuCaiMo-payInfo={}", payInfo);
        if (payInfo != null) {
            if (payInfo.getPlatformStatus().equals(OrderStatusEnums.SUCCESS.getInfo())) {
                MODEL_MAP.put("success", true);
                MODEL_MAP.put("url", "http://127.0.0.1");
            } else {
                MODEL_MAP.put("success", false);
            }
            return MODEL_MAP;
        } else {
            MODEL_MAP.put("success", false);
            return MODEL_MAP;
        }
    }
}
